/**
 * @description 线程同步例程：说明静态和非静态的同步方法
 * 程序说明：
 * 建立两个线程，同时运行，分别执行静态同步方法 ，非静态同步方法，和非静态非同步方法。
 * 
 * （java虚拟机通过对象锁实现多线程同步处理）
 * 
 * @pageNo 411
 * @author mlmoria
 * @date 2017年2月7日
 * 
 */
package No11Thread;

class J_Experiment{
	public static void mb_sleep(long millis){
		try {
			Thread.sleep(millis);
		} catch (InterruptedException e) {
		
			e.printStackTrace();
		}
	}
	public static synchronized void mb_methodStatic(int id){
		System.out.println("线程"+id+"进入静态同步方法");
		mb_sleep(1000);
		System.out.println("线程"+id+"离开静态同步方法");
		
	}
	
	public  synchronized void mb_methodSynchronized(int id){
		System.out.println("线程"+id+"进入非静态同步方法");
		mb_sleep(1000);
		System.out.println("线程"+id+"离开非静态同步方法");
		
	}

	public void mb_method(int id){
		System.out.println("线程"+id+"进入非静态非同步方法");
		mb_sleep(1000);
		System.out.println("线程"+id+"离开非静态非同步方法");
	}
	
}


public class J_SynchronizedStatic extends Thread{

	public int m_ID;
	public J_Experiment m_data;
	
	public J_SynchronizedStatic(int id) {
       m_ID=id;  
	}
	public void run(){
		System.out.println("运行线程："+m_ID);
		m_data.mb_methodSynchronized(m_ID);
		m_data.mb_methodStatic(m_ID);
		m_data.mb_method(m_ID);
		System.out.println("结束线程："+m_ID);
	}
	
	public static void main(String[] args) {
		int n=2;
		J_SynchronizedStatic[] t=new J_SynchronizedStatic[n];
		J_Experiment d=new J_Experiment();
		for(int i=0;i<n;i++){
			t[i]=new J_SynchronizedStatic(i);
			t[i].m_data=d;
			t[i].start();
			
		}
		System.out.println("方法main结束");
	}
	
}
